package com.ahuan.utils;

import org.apache.poi.ss.usermodel.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class FileUploadUtil {


    /**
     * 将Excel文件转换为对象列表
     * @param multipartFile
     * @param targetType
     * @return
     * @param <T>
     * @throws IOException
     */
    public static <T> List<T> processExcelToObject(MultipartFile multipartFile, Class<T> targetType) throws IOException {
        List<T> objectsList = new ArrayList<>();

        // 创建一个工作簿对象
        Workbook workbook = WorkbookFactory.create(multipartFile.getInputStream());

        // 获取第一个工作表
        Sheet sheet = workbook.getSheetAt(0);

        // 获取目标类的所有字段
        Field[] fields = targetType.getDeclaredFields();

        // 迭代工作表中的行
        Iterator<Row> rowIterator = sheet.iterator();
        while (rowIterator.hasNext()) {
            Row row = rowIterator.next();
            // 跳过表头行
            if (row.getRowNum() == 0) {
                continue;
            }

            try {
                // 创建目标对象实例
                T obj = targetType.getDeclaredConstructor().newInstance();

                // 获取单元格的值并设置到对象中
                for (int i = 0; i < fields.length; i++) {
                    Cell cell = row.getCell(i);
                    if (cell != null) {
                        Field field = fields[i];
                        field.setAccessible(true); // 设置字段可访问
                        Class<?> fieldType = field.getType();

                        // 根据字段类型设置字段值
                        if (fieldType == String.class) {
                            field.set(obj, cell.getStringCellValue());
                        } else if (fieldType == Integer.class || fieldType == int.class) {
                            field.set(obj, (int) cell.getNumericCellValue());
                        } else if (fieldType == Double.class || fieldType == double.class) {
                            field.set(obj, cell.getNumericCellValue());
                        }
                        // 添加其他可能的类型判断和设置...
                    }
                }

                // 将对象添加到列表中
                objectsList.add(obj);
            } catch (Exception e) {
                e.printStackTrace(); // 异常处理
            }
        }

        // 关闭工作簿
        workbook.close();

        return objectsList;
    }

    /**
     *  保存文件到指定目录
     * @param uploadDir 上传目录
     * @param fileName  指定文件名
     * @param multipartFile multipartFile对象
     * @throws IOException
     */
    public static void saveFile(String uploadDir, String fileName, MultipartFile multipartFile) throws IOException {
        File directory = new File(uploadDir);

        // 如果目录不存在，则创建目录
        if (!directory.exists()) {
            directory.mkdirs();
        }

        // 保存文件到磁盘
        String filePath = uploadDir + File.separator + fileName;
        File dest = new File(filePath);
        multipartFile.transferTo(dest);
    }

    /**
     *  获取文件名
     * @param multipartFile
     * @return
     */
    public static String getFileName(MultipartFile multipartFile) {
        return multipartFile.getOriginalFilename();
    }

    /**
     *   获取文件大小
     * @param multipartFile
     * @return
     */
    public static long getFileSize(MultipartFile multipartFile) {
        return multipartFile.getSize();
    }
}
